import os
import pandas as pd
import numpy as np

def adjust_angle(value, min_val, max_val, adjustment=90):
    """
    通过加减固定数值来调整角度值，使其落在指定范围内。
    
    参数:
    value: 角度值
    min_val: 目标范围的最小值
    max_val: 目标范围的最大值
    adjustment: 调整的幅度，默认为90度
    
    返回:
    调整后的角度值
    """
    if pd.isna(value):
        return value  # 如果是NaN，保持不变

    while value < min_val or value > max_val:
        if value < min_val:
            value += adjustment
        elif value > max_val:
            value -= adjustment

    return value

def swap_and_adjust_columns(file_path):
    """
    读取CSV文件，交换前两列的数据，并将第一列控制在-180到+180之间，
    第二列控制在-90到+90之间，返回修改后的DataFrame。
    
    参数:
    file_path: CSV文件的路径
    
    返回:
    修改后的DataFrame
    """
    # 读取CSV文件
    df = pd.read_csv(file_path)
    
    # 检查是否有至少两列
    if len(df.columns) < 2:
        print(f"文件 {file_path} 的列数少于两列，无法交换和调整。")
        return None
    
    # 获取列名
    col_list = list(df.columns)
    first_col, second_col = col_list[0], col_list[1]
    
    try:
        # 确保这两列都是数值类型，以便进行数学运算
        df[first_col] = pd.to_numeric(df[first_col], errors='coerce')
        df[second_col] = pd.to_numeric(df[second_col], errors='coerce')
        
        # 创建临时列以保存原始数据
        temp_col1 = df[first_col].copy()
        temp_col2 = df[second_col].copy()
        
        # 交换并调整数值
        df[first_col] = temp_col2
        df[second_col] = temp_col1
        
        # 控制第一列在 -180 到 +180 之间
        df[first_col] = df[first_col].apply(lambda x: adjust_angle(x, -180, 180))
        
        # 控制第二列在 -90 到 +90 之间
        df[second_col] = df[second_col].apply(lambda x: adjust_angle(x, -90, 90))
        
        # 检查是否有任何非数值项被转换为NaN，并打印警告信息
        if df[[first_col, second_col]].isnull().values.any():
            print(f"警告：文件 {file_path} 中存在非数值项，已将这些项转换为NaN并进行了操作。")
            
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {e}")
        return None
    
    return df

def process_folder(input_folder, output_folder, start_number=1):
    """
    遍历输入文件夹中的所有CSV文件，交换前两列的数据并对它们进行调整，
    并将修改后的文件保存到输出文件夹中，使用指定起始编号的新文件名。
    
    参数:
    input_folder: 包含原始CSV文件的文件夹路径
    output_folder: 存储修改后CSV文件的新文件夹路径
    start_number: 新文件名的起始编号，默认为1
    """
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 获取所有CSV文件并排序（可选），确保文件按顺序处理
    csv_files = [f for f in os.listdir(input_folder) if f.endswith('.csv')]
    csv_files.sort()  # 如果需要按照文件名排序

    counter = start_number
    for file_name in csv_files:
        file_path = os.path.join(input_folder, file_name)
        # 构建新文件名
        new_file_name = f"P8_1({counter}).csv"
        output_path = os.path.join(output_folder, new_file_name)

        # 交换前两列并调整数值，然后保存到新位置
        modified_df = swap_and_adjust_columns(file_path)
        if modified_df is not None:
            modified_df.to_csv(output_path, index=False)
            print(f"Processed and saved {file_name} as {new_file_name} to {output_path}")
            counter += 1
        else:
            print(f"Skipped {file_name} due to insufficient columns or processing error.")

# 使用函数
input_folder = r"D:\temp\xinda\ModelRecognition\p8"  # 替换为你的CSV文件夹路径
output_folder = r"D:\temp\xinda\ModelRecognition\p8s"  # 替换为你想要保存修改后文件的文件夹路径
start_number = 81  # 指定起始编号
process_folder(input_folder, output_folder, start_number)